package com.hmk.blogboot.handler;


/*自定义拦截器 用来拦截出现自定义异常跳转页面*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@ControllerAdvice  //该注解作用拦截出现@Controller注解的控制器，出现的异常
public class ControllerExceptionHandler {

    //创建Logger对象 异常信息日志进行打印
    private  final Logger  logger = LoggerFactory.getLogger(this.getClass());

    //创建出现异常 跳转error页面的处理器方法
    @ExceptionHandler(Exception.class)  //作用开启异常拦截器
    public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws  Exception{
        logger.error("Request URL : {} , Exception : {}",request.getRequestURL(),e);

        //有特定标记异常，就不要自定义拦截器，交给对应的拦截器（springboot提供的）处理异常
        //比如404资源找不到异常
        //使用注解工具类，根据异常找到响应状态码时，有对应异常如404异常，直接抛出异常交给springboot拦截器处理异常
        if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) !=null){
            throw e;
        }

        //创建一个ModeAndView对象
        ModelAndView mv  = new ModelAndView();
        //后端数据传递到前端进行展示
        mv.addObject("url",request.getRequestURL());
        mv.addObject("exception",e);
        //设置出现异常跳转页面
        mv.setViewName("error/error");
        //返回模板视图对象，
        return mv;
    }

}
